/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package transervfx.Vista;

import java.io.IOException;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.beans.InvalidationListener;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Pagination;
import javafx.scene.control.RadioButton;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.ToggleGroup;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Callback;
import javafx.util.Duration;
import transervfx.Dato.Entidad.Localidad;
import transervfx.Dato.Entidad.Pais;
import transervfx.Dato.Entidad.Provincia;
import transervfx.Dato.Entidad.Repartidor;
import transervfx.Dato.Entidad.ZonaRegional;
import transervfx.Logica.GestorPais;
import transervfx.Logica.GestorRepartidor;
import transervfx.Logica.GestorZona;
import transervfx.Vista.XML.pathRecusosFXML;
import utilidades.autocompletar.TextBoxAutoCompletar;
import utilidades.dialog.OptionPane;
import utilidades.number.IntegerTextField;

/**
 * FXML Controller class
 *
 * @author meli
 */
public class ABMRepartidor extends VentanaModal {

   
    private Timeline locationUpdateTimeline;
    final static private int tiempoDeRespuesta = 1000;
    
    @FXML
    private ImageView iconoBuscando;
    @FXML
    private TextField apellido;
    @FXML
    private TextField nombres;
    @FXML
    private ComboBox<String> tipoDoc;
    @FXML
    private IntegerTextField nroDoc;
    @FXML
    private IntegerTextField cuit;
    @FXML
    private ComboBox<String> condicionFrenteIva;
    @FXML
    private ComboBox<String> movilidad;
    @FXML
    private ComboBox<Pais> pais;
    @FXML
    private ComboBox<Provincia> provincia;
    @FXML
    private ComboBox<Localidad> localidad;
    @FXML
    private TextBoxAutoCompletar<ZonaRegional> zona;
    @FXML
    RadioButton ambos;
    @FXML
    RadioButton interno;
    @FXML
    RadioButton externo;
    @FXML
    private TableView<Repartidor> tableRepartidores;
    @FXML
    private TableColumn tableColumApellido;
    @FXML
    private TableColumn tableColumNombres;
    @FXML
    private TableColumn tableColumCuit;
    @FXML
    private TableColumn tableColumCondicionFrenteIva;
    @FXML
    private TableColumn tableColumTipoDoc;
    @FXML
    private TableColumn tableColumNroDoc;
    @FXML
    private TableColumn tableColumExterno;
    @FXML
    private TableColumn tableColumMovilidad;
    @FXML
    private Button buttonModificar;
    @FXML
    private Button buttonEliminar;
    @FXML
    private Button buttonVer;
    @FXML
    private Pagination paginador;
    private int itemPorPagina = 10;
    final ObservableList<Repartidor> dataSourceRepartidores = FXCollections.observableArrayList();
    final ObservableList<Pais> dataSourcePais = FXCollections.observableArrayList();
    final ObservableList<Provincia> dataSourceProvincia = FXCollections.observableArrayList();
    final ObservableList<Localidad> dataSourceLocalidad = FXCollections.observableArrayList();
    final ObservableList<ZonaRegional> dataSourceZonasDisponibles = FXCollections.observableArrayList();

    public ABMRepartidor(Stage ventanaPadre,String titulo,int x, int y) {
        super( ventanaPadre, titulo, x,  y);
        init();
    }
    
    public void init(){


        this.cargarPaicesProvinciasLocalidadesZonas();

        this.tableRepartidores.setItems(this.dataSourceRepartidores);


        paginador.setMaxPageIndicatorCount(5);
        int nroDePaginas = ((numeroDePaginasPorFiltro().intValue() - 1) / itemPorPagina) + 1;
        paginador.setPageCount(nroDePaginas);

        paginador.setPageFactory(new Callback<Integer, Node>() {
            @Override
            public Node call(Integer pageIndex) {
                return crearPagina(pageIndex);
            }
        });


        //Introduce un escuchador para cada campo del filtro.
        this.crearEscuchadores();

        //Hace un binding entre La columna y las propiedades del repartidor
        this.bindingTableColum();
    }

    private void cargarPaicesProvinciasLocalidadesZonas() {

        zona.setData(this.dataSourceZonasDisponibles);
        localidad.setItems(dataSourceLocalidad);
        provincia.setItems(dataSourceProvincia);
        dataSourcePais.addAll(GestorPais.getInstance().paises());

        pais.setItems(dataSourcePais);



        this.localidad.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Localidad>() {
            @Override
            public void changed(ObservableValue<? extends Localidad> selected, Localidad oldValue, Localidad newValue) {
                if (newValue != null) {

                    zona.setText("");
                    dataSourceZonasDisponibles.clear();
                    List<ZonaRegional> listZonaPorLocalidadSeleccionada = GestorPais.getInstance().zonas(newValue);
                    dataSourceZonasDisponibles.addAll(listZonaPorLocalidadSeleccionada);
                    //formatTooltipsConZonas(listZonaPorLocalidadSeleccionada);
                    zona.setData(listZonaPorLocalidadSeleccionada);

                }
            }
        });

        provincia.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Provincia>() {
            @Override
            public void changed(ObservableValue<? extends Provincia> selected, Provincia oldValue, Provincia newValue) {
                if (newValue != null) {

                    dataSourceLocalidad.clear();
                    dataSourceLocalidad.addAll(GestorPais.getInstance().localidades(newValue));

                    //dataSourceProvincia.clear();
                    //dataSourceProvincia.addAll( GestorPais.getInstance().provincias(newValue));
                }
            }
        });


        pais.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Pais>() {
            @Override
            public void changed(ObservableValue<? extends Pais> arg0, Pais arg1, Pais arg2) {
                if (arg2 != null) {
                    System.out.println("selecciono pais " + arg2.getId());
                    dataSourceProvincia.clear();
                    dataSourceProvincia.addAll(GestorPais.getInstance().provincias(arg2));
                }
            }
        });

        pais.getSelectionModel().select(0);
        provincia.getSelectionModel().select(21);
        this.localidad.getSelectionModel().select(46);
    }

    private void crearEscuchadores() {

        this.apellido.textProperty().addListener(this.escuchadorInputTextField);
        this.nombres.textProperty().addListener(this.escuchadorInputTextField);
        this.nroDoc.textProperty().addListener(this.escuchadorInputTextField);
        this.tipoDoc.valueProperty().addListener(this.escuchadorInputTextField);
        this.cuit.textProperty().addListener(this.escuchadorInputTextField);
        this.condicionFrenteIva.valueProperty().addListener(this.escuchadorInputTextField);
        this.movilidad.valueProperty().addListener(this.escuchadorInputTextField);
        this.zona.getTextField().textProperty().addListener(this.escuchadorInputTextField);

        this.ambos.pressedProperty().addListener(this.escuchadorInputTextField);
        this.externo.pressedProperty().addListener(this.escuchadorInputTextField);
        this.interno.pressedProperty().addListener(this.escuchadorInputTextField);

    }

    private void bindingTableColum() {

        this.tableColumApellido.setCellValueFactory(new PropertyValueFactory<Repartidor, String>("apellido"));
        this.tableColumNombres.setCellValueFactory(new PropertyValueFactory<Repartidor, String>("nombres"));
        this.tableColumTipoDoc.setCellValueFactory(new PropertyValueFactory<Repartidor, String>("tipoDoc"));
        this.tableColumNroDoc.setCellValueFactory(new PropertyValueFactory<Repartidor, Integer>("nroDoc"));
        this.tableColumCuit.setCellValueFactory(new PropertyValueFactory<Repartidor, Integer>("cuit"));
        this.tableColumCondicionFrenteIva.setCellValueFactory(new PropertyValueFactory<Repartidor, String>("condicionFrenteIva"));
        this.tableColumExterno.setCellValueFactory(new PropertyValueFactory<Repartidor, Boolean>("externo"));
        this.tableColumMovilidad.setCellValueFactory(new PropertyValueFactory<Repartidor, String>("movilidad"));

    }
    
    public void buttonNuevo(ActionEvent event) throws IOException {

        //esto crea la ventana repartidor con el padre, q seria la ventana ABMRepartidor es decir this
        new CrearRepartidor(this,"Crear repartidor", 800, 800);
    }

    public void buttonModificar(ActionEvent event) throws IOException {
       
        Repartidor repartidorSeleccionado = this.tableRepartidores.getSelectionModel().getSelectedItem();
        if (repartidorSeleccionado==null) {
          
            String[] textoBotones = {"Aceptar"};
            String msj = "Para modificar un repartidor debe seleccionarlo previamente.";
            
            OptionPane.showOptionDialog("Información!", msj, null, OptionPane.INFORMATION_MESSAGE, textoBotones);
        } else {
           
           
            System.err.print("SELECCIONADO "+repartidorSeleccionado);
            //es como que en realidad no queda seleccionado la fila, creo
            //dejame verlo, el drama es q tira un puntro nulo, es decir es un problema del ordenar
            //el cual no implementamos, dejame verlook
    
            repartidorSeleccionado = GestorRepartidor.getInstance().findByCompleto(repartidorSeleccionado);
           
            System.out.println("Apellido: " + repartidorSeleccionado.getApellido() + " Nombres:" + repartidorSeleccionado.getNombres());

           //this.apellido.requestFocus(); 
            new ModificarRepartidor(repartidorSeleccionado,this,"Modificar repartidor", 800, 800);
  
        }
    }

    public void buttonEliminar(ActionEvent event) throws IOException {
        
        Repartidor repartidorSeleccionado = this.tableRepartidores.getSelectionModel().getSelectedItem();
        
        if (repartidorSeleccionado==null) {
            
            String[] textoBotones = {"Aceptar"};
            String msj = "Para eliminar un repartidor debe seleccionarlo previamente.";
            OptionPane.showOptionDialog("Información!", msj, null, OptionPane.INFORMATION_MESSAGE, textoBotones);
        
        } else {

           
            
            try {
                //aca va la ventana q luego te paso q pregunta si realmente quiere eliminar
                //esta ventan retorna 1 si apretas aceptar y 0 si paretas cancelar
                //luego con un if te preguntas si apretaste 1 o 0, ok
                //fijate si elimna
                //pueden existir muchos botones.....
                String[] textoBotones = {"Si", "No"};

                String msj = "El repartidor '" + repartidorSeleccionado.getApellido() + " " + repartidorSeleccionado.getNombres() + "' será eliminado del sistema.\n¿Desea continuar?";

                //la venta al cerra da que boton apreto, es decir, si es el boton 0, 1 etc
                int nroBotonApretado = OptionPane.showOptionDialog("Cuidado!", msj, null, OptionPane.WARNING_MESSAGE, textoBotones);
                if (nroBotonApretado == 0) {
                    
                    GestorRepartidor.getInstance().eliminarRepartidor(repartidorSeleccionado);
                    
                    String[] textoBotones2 = {"Aceptar"};
                    String msj2 = "El repartidor '" + repartidorSeleccionado.getApellido() + " " + repartidorSeleccionado.getNombres() + "' ha sido eliminado del sistema.";
                    OptionPane.showOptionDialog("Repartidor eliminado", msj2, null, OptionPane.SUCESS_MESSAGE, textoBotones2);
                    this.dataSourceRepartidores.remove(repartidorSeleccionado);
                    
                } else {
                    if (nroBotonApretado == 1) {
                    }
                }



            } catch (Exception ex) {
                //el mensaje de error va a decir la causa porq la cual no se pudo eliminar
                System.out.println(ex.getMessage());
                OptionPane.showOptionDialog("Error!", ex.getMessage(), null, OptionPane.ERROR_MESSAGE, null);

            }

        }
    }
    
    
   
    
    public void buttonVer(ActionEvent event) throws IOException {
        
        Repartidor repartidorSeleccionado = this.tableRepartidores.getSelectionModel().getSelectedItem();
        
        if (repartidorSeleccionado==null) {
            
            String[] textoBotones = {"Aceptar"};
            String msj = "Para ver un repartidor debe seleccionarlo previamente.";
            OptionPane.showOptionDialog("Información!", msj, null, OptionPane.INFORMATION_MESSAGE, textoBotones);
            
        } else {
            
            repartidorSeleccionado = GestorRepartidor.getInstance().findByCompleto(repartidorSeleccionado);
            new VerRepartidor(repartidorSeleccionado,this,"Ver repartidor", 800, 800);
        }
    }

    public void buttonCancelar(ActionEvent event) {
        this.close();
    }

    public Node crearPagina(int pageIndex) {

        String tDoc = (this.tipoDoc.getSelectionModel().getSelectedItem() == null) ? "" : this.tipoDoc.getSelectionModel().getSelectedItem();
        Integer nDoc = (this.nroDoc.textProperty().get().isEmpty()) ? null : this.nroDoc.numberProperty().getValue();

        String condIva = (this.condicionFrenteIva.getSelectionModel().getSelectedItem() == null) ? "" : this.condicionFrenteIva.getSelectionModel().getSelectedItem();
        String movilida = (this.movilidad.getSelectionModel().getSelectedItem() == null) ? "" : this.movilidad.getSelectionModel().getSelectedItem();

        //String zon = (this.zona.getSelectionModel().getSelectedItem() == null) ? "" : this.zona.getSelectionModel().getSelectedItem().getNombre();
        ZonaRegional zon = this.zona.getValue();
        //crea el contenedor de la tabla, en este caso es un vbox
        VBox box = new VBox(1);

        //borra los datos de la tabla de usuarios
        this.dataSourceRepartidores.clear();
        int page = pageIndex * itemPorPagina;


        List<Repartidor> repartidoresFiltrados = GestorRepartidor.getInstance().buscarPorFiltro(this.apellido.getText(), this.nombres.getText(), tDoc, nDoc, condIva, movilida, zon, interno.isSelected(), externo.isSelected(), page, itemPorPagina);

   
        System.out.println("NRO " + repartidoresFiltrados.size() + " LISTA DE REPARTIDORES " + repartidoresFiltrados);
        this.dataSourceRepartidores.addAll(repartidoresFiltrados);

        box.getChildren().add(this.tableRepartidores);

        System.out.println("LA TABLA CONTIENE LOS REPSRTIDORES");
        for (Repartidor r : this.tableRepartidores.getItems()) {
            System.out.println(r.getNombres() + r.getApellido());
        }

        return box;
    }

    private Long numeroDePaginasPorFiltro() {

        String tDoc = (this.tipoDoc.getSelectionModel().getSelectedItem() == null) ? "" : this.tipoDoc.getSelectionModel().getSelectedItem();
        Integer nDoc = (this.nroDoc.textProperty().get().isEmpty()) ? null : this.nroDoc.numberProperty().getValue();

        String condIva = (this.condicionFrenteIva.getSelectionModel().getSelectedItem() == null) ? "" : this.condicionFrenteIva.getSelectionModel().getSelectedItem();
        String movilida = (this.movilidad.getSelectionModel().getSelectedItem() == null) ? "" : this.movilidad.getSelectionModel().getSelectedItem();

        ZonaRegional zon = this.zona.getValue();
        return GestorRepartidor.getInstance().numeroDeRepartidoresFiltrados(this.apellido.getText(), this.nombres.getText(), tDoc, nDoc, condIva, movilida, zon, interno.isSelected(), externo.isSelected());

    }

    private void buscarRepartidorPorFiltro(int ini, int nroElementos) {


        String tDoc = (this.tipoDoc.getSelectionModel().getSelectedItem() == null) ? "" : this.tipoDoc.getSelectionModel().getSelectedItem();
        Integer nDoc = (this.nroDoc.textProperty().get().isEmpty()) ? null : this.nroDoc.numberProperty().getValue();

        String condIva = (this.condicionFrenteIva.getSelectionModel().getSelectedItem() == null) ? "" : this.condicionFrenteIva.getSelectionModel().getSelectedItem();
        String movilida = (this.movilidad.getSelectionModel().getSelectedItem() == null) ? "" : this.movilidad.getSelectionModel().getSelectedItem();


        ZonaRegional zon = this.zona.getValue();
        List<Repartidor> repartidoresFiltrados = GestorRepartidor.getInstance().buscarPorFiltro(this.apellido.getText(), this.nombres.getText(), tDoc, nDoc, condIva, movilida, zon, interno.isSelected(), externo.isSelected(), ini, nroElementos);

      
        System.out.println("NUMERO " + repartidoresFiltrados.size() + " LISTA DE REPARTIDORES " + repartidoresFiltrados);

        this.dataSourceRepartidores.clear();
        this.dataSourceRepartidores.addAll(repartidoresFiltrados);
    }
    ChangeListener escuchadorInputTextField = new ChangeListener<Object>() {
        public void changed(ObservableValue observableValue, Object s, Object s1) {

            if (!s1.toString().isEmpty() || !s.toString().equals(s1)) {
                // delay location updates to we don't go too fast file typing

                iconoBuscando.setVisible(true);

                if (locationUpdateTimeline != null) {

                    locationUpdateTimeline.stop();
                }

                locationUpdateTimeline = new Timeline();
                locationUpdateTimeline.getKeyFrames().add(
                        new KeyFrame(new Duration(tiempoDeRespuesta),
                        new EventHandler<ActionEvent>() {
                            public void handle(ActionEvent actionEvent) {

                                System.out.println("locationUpdateTimeline " + locationUpdateTimeline.getDelay());

                                int nroDePaginas = ((numeroDePaginasPorFiltro().intValue() - 1) / itemPorPagina) + 1;
                                paginador.setPageCount(nroDePaginas);
                                buscarRepartidorPorFiltro(0, itemPorPagina);
                                iconoBuscando.setVisible(false);


                                //Si la tabla de los repartidores esta vacia, los botones Modificar, Eliminar y Ver
                                //se muestran grisados.
                                if (tableRepartidores.getItems().isEmpty()) {

                                    buttonModificar.setDisable(true);
                                    buttonEliminar.setDisable(true);
                                    buttonVer.setDisable(true);
                                } else {
                                    buttonModificar.setDisable(false);
                                    buttonEliminar.setDisable(false);
                                    buttonVer.setDisable(false);
                                }
                            }
                        }));
                locationUpdateTimeline.play();

            }
        }
    };

    

    void agregarRepartidorATableRepartidores(Repartidor repartidorNuevo) {
        this.dataSourceRepartidores.add(repartidorNuevo);
    }
    
    void modificarRepartidorEnTableRepartidores(Repartidor repartidorModificado) {
        //se supone q si modifico previamente selecciono, y como las ventanas son modales, no podes deseleccionar
        //por lo tanto uno tiene q estar seleccionado
        int  index=this.tableRepartidores.getSelectionModel().getSelectedIndex();
       
        this.dataSourceRepartidores.remove(index);
        this.dataSourceRepartidores.add(index,repartidorModificado);
    }
    
    void eliminarRepartidorDeTableRepartidores(Repartidor repartidorEliminado) {

        this.dataSourceRepartidores.remove(repartidorEliminado);

        System.out.println("HOLÑA");
    }
    
     @Override
    URL getURLFXML() {
          return pathRecusosFXML.class.getResource("ABMRepartidorFXML.fxml");
    }
}
